package org.execute.tool.excel转为viso文件;

import java.util.ArrayList;
import java.util.List;

public class ElementToBrainstormXml {

    // 生成XML的方法
    public static List<String> generateXml(List<Element> rootElements) {
        // 构建XML字符串缓冲区
        List<String> xml = new ArrayList<>();
        // 添加XML声明和根元素
        xml.add("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
        xml.add("<bs:Brainstorm xmlns:bs=\"http://schemas.microsoft.com/visio/2003/brainstorming\">\n");

        // 处理所有根元素（顶级主题）
        for (Element root : rootElements) {
            processElement(root, xml, 1);
        }

        // 关闭根元素
        xml.add("</bs:Brainstorm>");
        return xml;
    }

    // 递归处理元素及其子元素
    private static void processElement(Element element, List<String> xml, int level ) {
        // 生成TopicID（根据层级和父ID）
        String topicId = generateTopicId( element.getId());
        StringBuilder xmlS1 = new StringBuilder();
        StringBuilder xmlS2 = new StringBuilder();
        StringBuilder xmlS3 = new StringBuilder();
        // 添加当前元素的XML（考虑缩进美化）
        xmlS1.append(getIndent(level)).append("<bs:topic bs:TopicID=\"").append(topicId).append("\">\n");
        xml.add(xmlS1.toString());


        xmlS2.append(getIndent(level + 1)).append("<bs:text>").append(escapeXml(element.getContent())).append("</bs:text>\n");
        xml.add(xmlS2.toString());
        // 递归处理子元素
        if (element.getSubLevel() != null && !element.getSubLevel().isEmpty()) {
            for (Element child : element.getSubLevel()) {
                processElement(child, xml, level + 1);
            }
        }

        // 关闭当前元素标签
        xmlS3.append(getIndent(level)).append("</bs:topic>\n");
        xml.add(xmlS3.toString());
    }

    // 生成TopicID（如T1, T1.1, T1.1.1）
    private static String generateTopicId(String parentId ) {
            return "T" + parentId;

    }

    // 生成XML缩进（美化格式）
    private static String getIndent(int level) {
        StringBuilder indent = new StringBuilder();
        for (int i = 0; i < level; i++) {
            indent.append("    ");
        }
        return indent.toString();
    }

    // XML特殊字符转义
    private static String escapeXml(String content) {
        if (content == null) return "";
        return content.replace("&", "&amp;")
                .replace("<", "&lt;")
                .replace(">", "&gt;")
                .replace("\"", "&quot;")
                .replace("'", "&apos;");
    }

    // 测试方法
    public static void main(String[] args) {
        // 创建示例元素结构
        Element root = new Element();
        root.setId("1");
        root.setContent("Java");
        root.setNumberOfSpaces(0);

        Element child1 = new Element();
        child1.setId("1.1");
        child1.setContent("基础语法");
        child1.setNumberOfSpaces(1);
        child1.setParentLevel(root);

        Element child2 = new Element();
        child2.setId("1.2");
        child2.setContent("面向对象");
        child2.setNumberOfSpaces(1);
        child2.setParentLevel(root);

        List<Element> children = new ArrayList<>();
        children.add(child1);
        children.add(child2);
        root.setSubLevel(children);

        // 生成XML
        List<Element> rootElements = new ArrayList<>();
        rootElements.add(root);
        List xml = generateXml(rootElements);
        System.out.println(xml);
    }
}

